﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;

namespace Persistencia
{
    public class LogPersistencia
    {

        public void LogBusquedaRealizada(Log log)
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                mydb.Log.AddObject(log);
                mydb.SaveChanges();
            }
        }

        public List<Log> ReporteBusquedasPorFecha(DateTime fechaDesde, DateTime fechaHasta)
        {
            List<Log> resultado;
            DateTime fechaNueva = fechaHasta.AddDays(1);
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                var query = from l in mydb.Log
                            where l.Fecha >= fechaDesde &&
                            l.Fecha < fechaNueva
                            select l;
                resultado =  query.ToList();
                foreach (Log log in resultado)
                {
                    log.Usuario1Reference.Load();
                }
            }
            return resultado;
        }

        public List<Usuario> ReporteTop10UsuariosBusquedas()
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                var query = from u in mydb.Usuario
                            join l in mydb.Log on u.Id equals l.Usuario1.Id into logGroup
                            orderby logGroup.Count() descending
                            select new { cantBusquedas = logGroup.Count(),
                                         userID = u.Id};
                List<Usuario> lista = new List<Usuario>();
                UserPersistence userPersistence = new UserPersistence();
                foreach(var q in query.Take(10))
                {
                    Usuario user = userPersistence.GetUsuarioById(q.userID);
                    lista.Add(user);
                }
                return lista; 
            }
        }

        public List<Usuario> ReporteTop10UsuariosLogin()
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                var query = from u in mydb.Usuario
                            orderby u.Cantidad_Veces_Loguea descending
                            select u;
                return query.Take(10).ToList();
            }
        }

        public List<Array> ReporteTop5Busquedas()
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                var query = from l1 in mydb.Log
                            join l2 in mydb.Log on l1.Terminos equals l2.Terminos into busquedaGroup
                            orderby busquedaGroup.Count() descending
                            select new
                            {
                                cantBusquedas = busquedaGroup.Count(),
                                terminoBusqueda = l1.Terminos,
                            };
                List<Array> lista = new List<Array>();
                foreach (var q in query.Take(5))
                {
                    string[] datos = new string[2];
                    datos[0] = q.cantBusquedas.ToString();
                    datos[1] = q.terminoBusqueda;
                    lista.Add(datos);
                }
                return lista; 
            }
        }

    }
}
